package zuo.from0516.basic2020.class02;

import java.util.HashMap;
import java.util.Map;
import java.util.Set;

public class Code03_KM {
    public static int km(int[] arr, int k, int m){
        int[] t = new int[32];
        for (int num : arr){
            for (int i = 0; i < 32; i++) {
                //如果num向右移动i位与1相与之后不等于0，说明num在第i位上是1
                if(((num>>i) & 1) != 0){
                    t[i]++;
                }
//                t[i] += (num>>i)&1; 与上面三行代码相同
            }
        }
        int ans = 0;
        for (int i = 0; i < 32; i++) {
            if(t[i] % m != 0){//出现k次的这个数在第i位上，有1
                ans |= (1<<i);//i<<1:1左移i位，生成的数在第i位上有1,再与ans或（有1即为1）得到ans
            }
        }
        return ans;
    }

    // 保证arr中，只有一种数出现了K次，其他数都出现了M次,找到出现了K次的数。
    // M>1,K<M
    public static int onlyKTimes(int[] arr, int k, int m){
        HashMap<Integer, Integer> hashMap = new HashMap<>();
        for (int num : arr){
//            if(hashMap.get(num) != null){
//                hashMap.put(num, hashMap.get(num) + 1);
//            }else{
//                hashMap.put(num,1);
//            }
            hashMap.merge(num, 1, Integer::sum);
        }
        if(hashMap.containsValue(k)){
//            Set<Map.Entry<Integer, Integer>> entrySet = hashMap.entrySet();
//            for (Map.Entry<Integer, Integer> entry : entrySet){
//                if (entry.getValue().equals(k)){
//                    return entry.getKey();
//                }
//            }
            Set<Integer> nums = hashMap.keySet();
            for (int num : nums){
                if (hashMap.get(num) == k){
                    return num;
                }
            }
        }
        return -1;
    }

    public static void main(String[] args) {
        int[] arr = {1,1,2,2,9,3,3,4,4,5,5};
        int i = onlyKTimes(arr, 1, 2);
        int j = km(arr, 1, 2);
        System.out.println(i+ " " +j);
    }
}
